<?php

namespace origin;

/**
 * Openssl公钥私钥加密解密类
 * @author dece <decezz@qq.com>
 */
class Openssl {

    // 配置文件
    public $conf = [
        'pubkey'    => '', // 公钥
        'prikey'    => '', // 私钥
    ];
    // 公钥
    private $publicKey;
    // 私钥
    private $privateKey;
    // 填充方式
    private $padding;
    // 填充列表
    private $paddingList = [
        OPENSSL_PKCS1_PADDING,
        OPENSSL_SSLV23_PADDING,
        OPENSSL_PKCS1_OAEP_PADDING,
        OPENSSL_NO_PADDING,
    ];

    /**
     * 构造函数
     * @param config 配置数组
     */
    public function __construct( $config = array() ){
        // 配置参数
        $this->conf = array_merge($this->conf, $config);
        // 解析公钥
        $this->publicKey = openssl_pkey_get_public($this->conf['pubkey']);
        // 解析私钥
        $this->privateKey = openssl_pkey_get_private($this->conf['prikey']);
    }

    /**
     * 公钥加密
     * @param data 要加密的数据
     * @param padding 填充方式
     * @return encodeData 加密密文
     */
    public function pubEncrypt( $data, $padding = 1 ){
        // 处理填充方式
        $this->hookPadding($padding);
        // 加密数据
        openssl_public_encrypt($data, $enData, $this->publicKey, $this->padding);
        // 签名转换成Base64编码 可读
        $encodeData = base64_encode($enData);

        return $encodeData;
    }

    /**
     * 私钥加密
     * @param data 要加密的数据
     * @param padding 填充方式
     * @return encodeData 加密密文
     */
    public function priEncrypt( $data, $padding = 1 ){
        // 处理填充方式
        $this->hookPadding($padding);
        // 加密数据
        openssl_private_encrypt($data, $enData, $this->privateKey, $this->padding);
        // 签名转换成Base64编码 可读
        $encodeData = base64_encode($enData);

        return $encodeData;
    }

    /**
     * 公钥解密
     * @param data 密文数据
     * @param padding 填充方式
     * @return deData 解密密文
     */
    public function pubDecrypt( $data, $padding = 1 ){
        // 处理填充方式
        $this->hookPadding($padding);
        // Base64解码
        $decodeData = base64_decode($data);
        // 解密数据
        openssl_public_decrypt($decodeData, $deData, $this->publicKey, $this->padding);

        return $deData;
    }

    /**
     * 私钥解密
     * @param data 密文数据
     * @param padding 填充方式
     * @return deData 解密密文
     */
    public function priDecrypt( $data, $padding = 1 ){
        // 处理填充方式
        $this->hookPadding($padding);
        // Base64解码
        $decodeData = base64_decode($data);
        // 解密数据
        openssl_private_decrypt($decodeData, $deData, $this->privateKey, $this->padding);

        return $deData;
    }

    /**
     * 填充方式
     * @param padding 填充方式
     * @return void
     */
    private function hookPadding( $padding = 1 ){
        if (!in_array($padding, $this->paddingList)) {
            $padding = OPENSSL_PKCS1_PADDING;
        }
        $this->padding = $padding;
    }
}